grammar Sql;

// Parser Rules
// 根规则：一个SQL语句
sqlStatement
    : createTableStatement
    | insertStatement
    | selectStatement
    | updateStatement
    | deleteStatement
    | beginTransactionStatement
    | EOF
    ;

// CREATE TABLE语句
createTableStatement
    : CREATE TABLE tableName '(' columnDefinition (',' columnDefinition)* ')' ';'?
    ;

columnDefinition
    : columnName dataType
    ;

dataType
    : INT
    | VARCHAR '(' INTEGER ')'
    | TEXT
    | FLOAT
    | DOUBLE
    | BOOLEAN
    ;

// INSERT INTO语句
insertStatement
    : INSERT INTO tableName '(' columnName (',' columnName)* ')' 
      VALUES '(' value (',' value)* ')' ';'?
    ;

// SELECT语句
selectStatement
    : SELECT selectElements 
      FROM tableName 
      whereClause?
      orderByClause?
      limitClause?
      ';'?
    ;

selectElements
    : '*'
    | columnName (',' columnName)*
    ;

whereClause
    : WHERE condition (AND condition)*
    ;

condition
    : columnName operator value
    ;

operator
    : '='
    | '!='
    | '<'
    | '>'
    | '<='
    | '>='
    | LIKE
    ;

orderByClause
    : ORDER BY columnName (ASC | DESC)?
    ;

limitClause
    : LIMIT INTEGER
    ;

// UPDATE语句
updateStatement
    : UPDATE tableName 
      SET assignment (',' assignment)* 
      whereClause?
      ';'?
    ;

assignment
    : columnName '=' value
    ;

// DELETE语句
deleteStatement
    : DELETE FROM tableName whereClause? ';'?
    ;

// BEGIN TRANSACTION语句
beginTransactionStatement
    : BEGIN TRANSACTION ';'?
    | BEGIN ';'?
    ;

// 基础元素
tableName
    : IDENTIFIER
    ;

columnName
    : IDENTIFIER
    ;

value
    : STRING
    | INTEGER
    | FLOAT_LITERAL
    | TRUE
    | FALSE
    | NULL
    ;

// Lexer Rules (Tokens)
// 关键字
CREATE      : C R E A T E ;
TABLE       : T A B L E ;
INSERT      : I N S E R T ;
INTO        : I N T O ;
SELECT      : S E L E C T ;
FROM        : F R O M ;
WHERE       : W H E R E ;
UPDATE      : U P D A T E ;
DELETE      : D E L E T E ;
SET         : S E T ;
VALUES      : V A L U E S ;
AND         : A N D ;
OR          : O R ;
ORDER       : O R D E R ;
BY          : B Y ;
ASC         : A S C ;
DESC        : D E S C ;
LIMIT       : L I M I T ;
BEGIN       : B E G I N ;
TRANSACTION : T R A N S A C T I O N ;
LIKE        : L I K E ;

// 数据类型
INT         : I N T | I N T E G E R ;
VARCHAR     : V A R C H A R ;
TEXT        : T E X T ;
FLOAT       : F L O A T ;
DOUBLE      : D O U B L E ;
BOOLEAN     : B O O L E A N | B O O L ;

// 字面量
TRUE        : T R U E ;
FALSE       : F A L S E ;
NULL        : N U L L ;

// 标识符
IDENTIFIER  : [a-zA-Z_][a-zA-Z_0-9]* ;

// 数值
INTEGER     : [0-9]+ ;
FLOAT_LITERAL : [0-9]+ '.' [0-9]+ ;

// 字符串
STRING      : '\'' ( ~'\'' | '\'\'' )* '\'' ;

// 空白字符和注释
WS          : [ \t\r\n]+ -> skip ;
LINE_COMMENT : '--' ~[\r\n]* -> skip ;
BLOCK_COMMENT : '/*' .*? '*/' -> skip ;

// 大小写不敏感的辅助片段
fragment A : [aA] ;
fragment B : [bB] ;
fragment C : [cC] ;
fragment D : [dD] ;
fragment E : [eE] ;
fragment F : [fF] ;
fragment G : [gG] ;
fragment H : [hH] ;
fragment I : [iI] ;
fragment J : [jJ] ;
fragment K : [kK] ;
fragment L : [lL] ;
fragment M : [mM] ;
fragment N : [nN] ;
fragment O : [oO] ;
fragment P : [pP] ;
fragment Q : [qQ] ;
fragment R : [rR] ;
fragment S : [sS] ;
fragment T : [tT] ;
fragment U : [uU] ;
fragment V : [vV] ;
fragment W : [wW] ;
fragment X : [xX] ;
fragment Y : [yY] ;
fragment Z : [zZ] ;
